﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using plust.Clases;
using plust.Persistencia;
using plust.Content;
using FirstFloor.ModernUI.Windows.Controls;

namespace plust.Content
{
    /// <summary>
    /// Interaction logic for NuevaFacturaDialog.xaml
    /// </summary>
    public partial class NuevaFacturaDialog : UserControl
    {
        private PersistenciaDB persistencia = new PersistenciaDB();

        private Venta venta;

        private Cliente clienteSelect;

        public bool facturado { get; set; }

        private bool clienteSeleccionado = false;

        private enum Estado { Busqueda, NuevoCliente };

        private Window myWindow;

        Estado myEstado;
        
        public NuevaFacturaDialog()
        {
            InitializeComponent();

            this.Loaded += OnLoaded;
            
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            myWindow = Window.GetWindow(this);

            myWindow.Closing += myWindow_Closing;
        }

        private void myWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if(!this.facturado)
            {
                MessageBoxButton btn = MessageBoxButton.YesNo;

                MessageBoxResult mbs = ModernDialog.ShowMessage("¿Realmente desear cancelar la factura?", "Cancelar Factura", btn);

                if (mbs == MessageBoxResult.Yes)
                {
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }           
        }

        public NuevaFacturaDialog(Venta venta): this()
        {
            this.facturado = false;

            this.venta = venta;

            this.lblMonto.Text = venta.monto_venta.ToString();
            this.lblIva.Text = (venta.monto_venta * 0.19).ToString();
            this.lblTotal.Text = ((venta.monto_venta * 0.19) + venta.monto_venta).ToString();

            this.dgProductos.ItemsSource = venta.generarFilaProducto();

            this.dgResultadoBusquedaCliente.Visibility = System.Windows.Visibility.Hidden;
            this.spNuevoClienteForm.Visibility = System.Windows.Visibility.Hidden;

            this.spCliente.Children.Remove(this.spNuevoClienteForm);

            myEstado = Estado.Busqueda;

            Keyboard.Focus(tbBuscarCliente);
        }

        private void NuevaFacturaDialog_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            MessageBoxButton btn = MessageBoxButton.YesNo;

            MessageBoxResult mbs = ModernDialog.ShowMessage("¿Realmente desear cancelar la factura?", "Cancelar Factura", btn);

            if (mbs == MessageBoxResult.Yes)
            {
                e.Cancel = true;
            }
        }

        private void tbBuscarCliente_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (this.tbBuscarCliente.Text != "")
            {
                this.dgResultadoBusquedaCliente.ItemsSource = persistencia.buscarClientesPorString(this.tbBuscarCliente.Text).DefaultView;
                this.lblTituloBusqueda.Visibility = System.Windows.Visibility.Visible;
                this.lblTituloBusqueda.Text = this.dgResultadoBusquedaCliente.Items.Count + " Clientes que coinciden con '" + this.tbBuscarCliente.Text+"'";

                if (this.dgResultadoBusquedaCliente.Items.Count > 0)
                {
                    this.dgResultadoBusquedaCliente.Visibility = System.Windows.Visibility.Visible;
                }
                else
                {
                    this.dgResultadoBusquedaCliente.Visibility = System.Windows.Visibility.Hidden;
                }
            }
            else
            {
                this.dgResultadoBusquedaCliente.ItemsSource = null;
                this.dgResultadoBusquedaCliente.Visibility = System.Windows.Visibility.Hidden;
                this.lblTituloBusqueda.Text = "Sin resultados.";
            }
        }

        private void dgResultadoBusquedaCliente_Row_DoubleClick(object sender, RoutedEventArgs e)
        {
            if(this.dgResultadoBusquedaCliente.SelectedItem != null)
            {
                this.clienteSeleccionado = true;
                this.myEstado = Estado.Busqueda;
                this.clienteSelect = new Cliente();

                this.clienteSelect.id_cliente = int.Parse(((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["id"].ToString());
                this.clienteSelect.nombre = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["nombre"].ToString();
                this.clienteSelect.rut = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["rut"].ToString();
                this.clienteSelect.giro = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["giro"].ToString();
                this.clienteSelect.direccion = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["direccion"].ToString();
                this.clienteSelect.ciudad = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["ciudad"].ToString();
                this.clienteSelect.comuna = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["comuna"].ToString();

                lblNombre.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["nombre"].ToString();
                lblRut.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["rut"].ToString();
                lblGiro.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["giro"].ToString();
                lblDireccion.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["direccion"].ToString();
                lblCiudad.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["ciudad"].ToString();
                lblComuna.Text = ((DataRowView)dgResultadoBusquedaCliente.SelectedItem).Row["comuna"].ToString();
            }
        }

        private void btCrearFactura_Click(object sender, RoutedEventArgs e)
        {
            if(myEstado == Estado.Busqueda)
            {
                if (this.clienteSeleccionado)
                {
                    Factura factura = new Factura();
                    factura.fecha_emision = this.venta.fecha_venta;
                    factura.estado_pago = 0;
                    factura.valor_neto = this.venta.monto_venta;
                    factura.observacion = String.Empty;
                    factura.id_cliente = int.Parse(this.clienteSelect.id_cliente.ToString());

                    if (this.persistencia.ingresarFactura(factura))
                    {
                        new ModernDialog
                        {
                            Title = "CORRECTO",
                            Content = "Factura ingresada exitosamente."
                        }.ShowDialog();

                        this.facturado = true;

                        Window.GetWindow(this).Close();
                    }
                    else
                    {
                        new ModernDialog
                        {
                            Title = "ERROR",
                            Content = "Ha ocurrido un error inesperado.",
                            Foreground = Brushes.Red,
                            FontWeight = FontWeights.SemiBold,
                        }.ShowDialog();
                    }
                }
                else
                {
                    new ModernDialog
                    {
                        Title = "Error",
                        Content = "Seleccione un cliente.",
                        Foreground = Brushes.Red,
                        FontWeight = FontWeights.SemiBold,
                    }.ShowDialog();

                    Keyboard.Focus(tbBuscarCliente);
                }
            }

            if (myEstado == Estado.NuevoCliente)
            {
                Factura factura = new Factura();
                factura.fecha_emision = this.venta.fecha_venta;
                factura.estado_pago = 0;
                factura.valor_neto = this.venta.monto_venta;
                factura.id_cliente = this.persistencia.retornarIdUltimoCliente();

                if (this.persistencia.ingresarFactura(factura))
                {
                    new ModernDialog
                    {
                        Title = "CORRECTO",
                        Content = "Factura ingresada exitosamente."
                    }.ShowDialog();

                    this.facturado = true;

                    Window.GetWindow(this).Close();
                }
                else
                {
                    new ModernDialog
                    {
                        Title = "ERROR",
                        Content = "Ha ocurrido un error inesperado.",
                        Foreground = Brushes.Red,
                        FontWeight = FontWeights.SemiBold,
                    }.ShowDialog();
                }
            }
        }

        private void btCancelarNuevoCliente_Click(object sender, RoutedEventArgs e)
        {
            this.myEstado = Estado.Busqueda;

            this.btCrearFactura.IsEnabled = true;
            this.spNuevoClienteForm.Visibility = System.Windows.Visibility.Hidden;
            this.spCliente.Children.Remove(this.spNuevoClienteForm);
            this.spCliente.Children.Add(this.spBusquedaCliente);
            this.spBusquedaCliente.Visibility = System.Windows.Visibility.Visible;
            this.tbBuscarCliente.IsEnabled = true;
            this.btNuevoCliente.IsEnabled = true;

            this.tbNombreCliente.Text = "";
            this.tbRut.Text = "";
            this.tbGiro.Text = "";
            this.tbDireccion.Text = "";
            this.tbCiudad.Text = "";
            this.tbComuna.Text = "";
        }

        private void btIngresarNuevoCliente_Click(object sender, RoutedEventArgs e)
        {
            Cliente cliente = new Cliente();
            cliente.nombre = this.tbNombreCliente.Text;
            cliente.rut = this.tbRut.Text;
            cliente.giro = this.tbGiro.Text;
            cliente.direccion = this.tbDireccion.Text;
            cliente.ciudad = this.tbCiudad.Text;
            cliente.comuna = this.tbComuna.Text;

            if (this.persistencia.ingresarCliente(cliente))
            {
                this.myEstado = Estado.NuevoCliente;
                this.btCrearFactura.IsEnabled = true;
                this.lblNombre.Text = this.tbNombreCliente.Text;
                this.lblRut.Text = this.tbRut.Text;
                this.lblGiro.Text = this.tbGiro.Text;
                this.lblDireccion.Text = this.tbDireccion.Text;
                this.lblCiudad.Text = this.tbCiudad.Text;
                this.lblComuna.Text = this.tbComuna.Text;

                this.clienteSeleccionado = true;

                this.tbNombreCliente.Text = "";
                this.tbRut.Text = "";
                this.tbGiro.Text = "";
                this.tbDireccion.Text = "";
                this.tbCiudad.Text = "";
                this.tbComuna.Text = "";

                this.spNuevoClienteForm.Visibility = System.Windows.Visibility.Hidden;
                this.spCliente.Children.Remove(this.spNuevoClienteForm);
                this.spCliente.Children.Add(this.spBusquedaCliente);
                this.spBusquedaCliente.Visibility = System.Windows.Visibility.Visible;
                this.tbBuscarCliente.IsEnabled = true;
                this.btNuevoCliente.IsEnabled = true;

                new ModernDialog
                {
                    Title = "CORRECTO",
                    Content = "Cliente ingresado exitosamente."
                }.ShowDialog();
                
            }
            else
            {
                new ModernDialog
                {
                    Title = "ERROR",
                    Content = "Ha ocurrido un error inesperado.",
                    Foreground = Brushes.Red,
                    FontWeight = FontWeights.SemiBold,
                }.ShowDialog();
            }
        }

        private void btNuevoCliente_Click(object sender, RoutedEventArgs e)
        {
            this.spBusquedaCliente.Visibility = System.Windows.Visibility.Hidden;
            this.spCliente.Children.Remove(this.spBusquedaCliente);
            this.spCliente.Children.Add(this.spNuevoClienteForm);
            this.spNuevoClienteForm.Visibility = System.Windows.Visibility.Visible;
            this.tbBuscarCliente.Text = "";
            this.lblTituloBusqueda.Text = "";
            this.tbBuscarCliente.IsEnabled = false;
            this.btNuevoCliente.IsEnabled = false;
            this.btCrearFactura.IsEnabled = false;
            Keyboard.Focus(this.tbNombreCliente);
        }

        private void btCancelar_Click(object sender, RoutedEventArgs e)
        {
            Window.GetWindow(this).Close();         
        }
    }
}
